LinuC-2 - 202試験 - 2.09:HTTPサーバーとプロキシサーバー - 2.09.1 Apache HTTPサーバーの設定と管理

Last Update : January 02 2021 16:07:31

     

a. Webサーバー

1.Apache2 のダウンロード

Version httpd-2.0.48
Homepage http://www.apache.jp
Download http://www.apache.jp/dist/httpd/
Install httpd-2.0.48.tar.gz


2.Apache2のインストール

--prefix=PREFIX で、インストール場所を選択できます。デフォルトは、/usr/local/apache2 になります。WebDAV を使用したい場合は、--enable-dav を指定します。configureオプションを詳しく参照したい場合は、configure -h で確認してください。MPMについては以下後述。

$ cd /usr/local/src
$ tar xzvf httpd-2.0.48.tar.gz
$ cd httpd-2.0.48
$ ./configure --with-mpm=worker \
--enable-dav
$ make
# make install


3.マルチプロセッシングモジュール(MPM)

Apache2からは、マルチプロセッシングモジュール(MPM)というオプションを指定することができます。オプションを指定しない場合、prework でインストールされ、安定性と互換性が確保されます。大きなスケーラビリティを必要とするのであればworker、VirtualHostを用いる予定で、パフォーマンスの向上を得たいのであれば、perchild を選択するのがいいかもしれません。MPMについての詳細な説明はこちらを参照してください。なお、Windows版Apacheを使用するならば、mpm_winnt がデフォルトになります。

●MPMのオプション
--with-mpm=prework 安定性や古いソフトウェアとの互換性を保ちたい場合に指定します。MPMオプションを指定しない場合はデフォルトで、prework になります。Apache 1.3 互換で、従来からのプロセスのみ使用し、スレッドは使いません。
--with-mpm=worker マルチスレッドとマルチプロセスのハイブリッド型サーバを 実装します。ThreadsPerChild と MaxClients ディレクティブで効力を発揮します。
--with-mpm=perchild perchild は、VirtualHost を使用する際に効果的なMPMです。<IfModule perchild.c>~</IfModule>で、バーチャルホストごとに独立した動作環境を構築することができるようになります。


4.httpd.conf の編集

デフォルトでインストールした場合は、/usr/local/apache2/conf にhttpd.conf インストールされます。まず、最低限の動作ができるように設定を変更していきます。

# vi /usr/local/apache2/conf/httpd.conf

 ListenでApacheが使用するポート番号を指定します。通常は変更する必要はありませんが、筆者の場合、Windows 上でもApache を動作させているため、ここでは8080を指定しました。squid の起動ポート番号を3128 番から8080 番に変更した方は、squid と重複しないポート番号を指定するようにしてください。

Listen 8080

ServerAdminディレクティブは、クライアントからのリクエストに対してエラーメッセージを返す際に表示される管理人のメールアドレスを正しく記述します。通常は、root や webmaster などを記述しておき、メールサーバーのalias 機能を使用して、実際にメールを受け取る人に配送されるようにしておきます。

ServerAdmin root@click-rescue.com

ServerNameでは、サーバーのホスト名を記述します。ここでは、ローカルホストを記述します。

ServerName 127.0.0.1:8080

ドキュメントルートの設定を行います。ドキュメントルートとは、ホームページのコンテンツを格納するトップの階層のことで、ここで指定した場所に index.html や画像などを置きます。各自変更する必要があれば変更してください。ここでは、/home/sakura/public_html をドキュメントルートとして指定します。

DocumentRoot "/home/sakura/public_html"


5.文字化けを回避する

AddDefaultCharsetの部分をコメントアウトして無効にするか、off に指定しておきます。このディレクティブが有効になっているとデフォルトの文字コードが ISO-8859-1 となるため、文字化けが発生します。

#AddDefaultCharset ISO-8859-1

直接、文字化けには結びつきませんが、デフォルトの使用言語の優先度も変更しておいた方が無難です。Language Priorityでは、言語の優先度を変更することができます。ここでは、日本語である ja を先頭にし、日本語を最優先にします。

LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

以上で最低限、動作する設定は完了です。より詳しく設定を行い方は、httpd.conf の設定を参照してください。


6.Apache2の再起動

再起動の前にコンフィグレーションテストを実行してみます。エラーが表示されなければApache2を起動してください。

# /usr/local/apache2/bin/apachectl configtest
Syntax OK

/usr/local/apache2/bin/apachectl start

再起動したら、クライアントマシンから 「http://172.16.50.2」のようにしてアクセスしてみましょう。Apacehのテストページが表示されるはずです。 lynx がインストールされていれば、ローカルホストにアクセスするとテストページが表示されます。クライアントマシンから確認した場合は、お決まりのこちらのようなページが表示されます。

$ lynx http://127.0.0.1:8080


7.Apacheの自動起動設定

最後にシステム起動時にApacheが自動で起動するように /etc/rc.d/init.d に以下の自動起動スクリプトを保存し、実行権限を付与します。

# chmod 755 /etc/rc.d/init.d/httpd
# chkconfig --add httpd
# chkconfig --list httpd
httpd 0:オフ 1:オフ 2:オフ 3:オン 4:オフ 5:オン 6:オフ

#
#!/bin/bash
#
# Startup script for Apache Web Server
#
# chkconfig: 345 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# pidfile: /var/run/httpd.pid
# config: /usr/local/apache2/conf/httpd.conf

# See how we were called.
case "$1" in
start)
/usr/local/apache2/bin/apachectl start
;;
stop)
/usr/local/apache2/bin/apachectl stop
;;
status)
/usr/local/apache2/bin/apachectl status
;;
restart)
/usr/local/apache2/bin/apachectl restart
;;
graceful)
/usr/local/apache2/bin/apachectl graceful
;;
*)
echo "Usage: $0 {start|stop|restart|graceful|status}"
exit 1
esac

exit 0


参考:モジュール一覧
参考:ディレクティブ一覧



b. httpd.confの設定

1.Section 1: Global Environment

Global Environment は、Apache 全体に影響を与えるセクションです。

ServerRoot は、Apache をインストールした場所のパスが指定されており、このディレクトリ以下に conf や logs などのサブディレクトリが格納されます。以降で出現するディレクティブの多くは、このServerRoot からの相対パスで記述されている事が多いため、通常は、デフォルトのままにして置いてください。

ServerRoot "/usr/local/apache2"

Timeout は、クライアントからの接続要求を受け取ってからタイムアウトになるまでの時間を秒単位で指定します。デフォルトでは、300秒が指定されており、これはたいていのシチュエーションにおいて必要十分な値なので特に変更する必要はありません。ここで設定した時間を過ぎてもパケットが送信されない場合、ブラウザはエラーメッセージを返します。因みに、Apache1.2以前はデフォルトで1200秒が指定されていました。

Timeout 300


KeepAlive は、クライアントからの接続要求を受け取った際に、すぐにはHTTPセッションを閉じずに、ある一定の時間までは継続してセッションを保っておく機能です。これは、クライアントからの接続要求があった場合に、クライアントは通常、リンクを辿って他のページを見にいこうとするため、ある一定期間はセッションを保っておこうというものです。当然、有効にしておく事でパフォーマンスの向上に繋がります。

なお、その一定期間の間、セッションを保っておく時間を指定するディレクティブが、KeepAliveTimeout で、デフォルトでは15秒に設定されています。要するに、クライアントからの接続要求後、15秒経経過しても再接続要求がない場合は、Apache はセッションを切断します。

MaxKeepAliveRequests
は、KeepAlive がOn の時に、接続要求を受け付ける最大許容値を指定します。この値を考慮するには、1ページあたりのファイル数+アルファを考慮しておかなければなりません(画像なども接続要求に含まれるため)。Apache のドキュメントを読む限りは、この値を高い値に設定しておく事が推奨されています。なお、値を「0」に設定すると無制限になります。

KeepAlive On
KeepAliveTimeout 15
MaxKeepAliveRequests 100


1.3から2.0のバージョンアップにより、BindAddress ディレクティブと Port ディレクティブは削除され、より柔軟なListen ディレクティブに置き換わりました。Listen が設定ファイルになければ、サーバは起動に失敗してしまいますので注意してください。

Listen 80

Listen ディレクティブでは、特定の IP アドレスやポート番号だけを listen することができるので複数のポート番号を指定したり、IPアドレスとポート番号共に指定する事で、 サーバは指定されたポートとインターフェースに対して listen させることができます。なお、VirtualHostを実装する場合は、ここで指定した以外のポート番号は使用する事ができません。あくまで、Listenディレクテイブで指定した範囲内で<VirtualHost>に指定するようにしてください。

●例1
Listen 80
Listen 8080

●例2
Listen 172.16.50.2:80
Listen 172.16.50.3:8080



2.Section 2: 'Main' server configuration

サーバを実行するためのユーザーとグループを指定します。ここで指定するユーザーとグループに、nobodyを設定する方も多いと思いますが、特定の新しいユーザとグループを作成して、設定する事が推奨されています。その理由として、nobody ユーザがシステムで 他の役割を担っている可能性もありますので、なんでもかんでも nobody に設定してしまうと今度は逆にnobody ユーザーが乗っ取られたときの危険性も高くなります。なので、できる限り、専用のユーザーで実行した方が好ましいといえます。

User apache
Group apache

ServerAdmin では、サーバーがエラードキュメントを返す際などに表示される管理者のメールアドレスを指定しておきます。

ServerAdmin root@click-rescue.com


ServerName は、サーバ自身が使用するサーバ名とポート番号を指定します。このディレクティブは、Apache2からはデフォルトでコメントアウトされており、BIND でサーバー名が自動取得できるようになっていれば指定する必要はありませんが、起動時の問題を避けるためにも明示的に指定しておく事が推奨されています。

ServerName linux.click-rescue.com:80


UseCanonicalName では、Apache 自身が自己参照のURLをどのように決定するかを指定します。On の場合は、ServerName で指定したポート番号とホスト名をクライアントに返します。Off の場合は、クライアントから提供されたホスト名やポート番号をそのまま使用して返します。この他にも、DNS を指定する事もできますが、これはIPベースのバーチャルホストで使われる事を想定しており、Hostヘッダーをつけないクライアントをサポートします。基本的には、On で構わないと思いますが(Apache1.3x ではデフォルトOn だったはず…)、認証を有効にしている場合は、クライアントに対して2度認証を行わせなければならないようです。この辺りは筆者も微妙に理解不足なので、マニュアルの方も併せて参照してください。

UseCanonicalName Off


もう説明するまでもないと思いますが、ドキュメントルートを指定します。ここで指定したパスにHTMLドキュメント等を置いておきます。基本的には、ここで指定したパスより上位の階層へはアクセスする事ができませんが、SymbolicLink やalias を使用すれば、他の階層のディレクトリへアクセスさせる事も可能です。

DocumentRoot "/home/sakura/public_html"


<Directory /> では、サーバルートディレクトリに対する設定を行っています。これは、これより下の行で出てくる<Directory>(ドキュメントルートディレクトリ)とは別のものなので区別するようにしてください。デフォルトでは、シンボリックリンクのみ許可するようになっています。特に設定を変更する必要はないでしょう。

<Directory />
     Options FollowSymLinks
     AllowOverride None
</Directory>


2度目に出てくる<Directory>では、ドキュメントルートを指定します。これは、上の行で出てきたDocumentRoot と同じディレクトリを指定しておきます。なお、この<Directory>内で指定する設定に関しては非常に重要なので

<Directory "/home/sakura/public_html">
     Options FollowSymLinks
     AllowOverride All
     Order allow,deny
     Allow from all
</Directory>

Multiviews を有効にしておくことで、曖昧なURLを指定した場合でも、クライアントに対して最適な値を検索して返す事ができるようになります。具体的に説明すると、仮にホームディレクトリ内にtest.php がある場合に、http://linux.click-rescue.com/test とブラウザに入力すると、そのようなファイルがないため通常は「ページが表示されません」というエラーが返されますが、Multiviewsが有効になっていると、自動的にtest.* で始まる全てのファイルを検索し、結果としてtest.php をクライアントに返します。ひとつ注意点としては、Options All を指定したとしても、Multiviews は有効にはなりません。必ず、明示的に記述しておく必要があります。

Options Multiviews


ユーザーにホームページスペースを提供する場合などに指定するのが、UserDir ディレクティブです。デフォルトでは、public_html になっています。この指定により、ユーザーのWebサイトのURL は、http://linux.click-rescue.com/~sakuraという形式になり、実際にコンテンツを置く場所は、/home/sakura/public_html になります。

UserDir public_html

ユーザーディレクトリの詳細な設定は、すぐ下に記述されている、

<Directory /home/*/public_html>
中略
</Directory>

の間で指定します。サンプルで用意されているものは、読み取り専用サイトの例を表しています。必要に応じてコメントを削除し、サイトを提供するルールに従って変更してください。

ユーザー用のディレクトリを提供するには、ユーザーのディレクトリである /home/sakura と初期ディレクトリの piblic_html のパーミッションを変更する必要があります。デフォルトの状態では、ホームディレクトリのパーミッションは、700(rwx------)になっており、他のユーザーには実行権限が付与されていないのでホームページを閲覧することができません。まず、ホームディレクトリのパーミッションを以下のようにして変更します。

$ chmod 711 /home/sakura

同様にして、public_html にも実行権限、参照権限を与えます。デフォルトでは、public_html のディレクトリは存在しないので新規に作成します。パーミッションが755 になっていなければ、chmod コマンドで 755 に変更してください。

$ mkdir /home/sakura/public_html
$ chmod 755 /home/sakura/public_html
$ ls -l /home/sakura

合計 4
drwxr-xr-x 2 sakura sakura 4096 12月 28 17:00 public_html

この時、注意しておきたいのは、public_html ディレクトリをroot として作成した場合は、所有者がroot となっているので、ユーザーsakura はアップロードする事ができません。必ず、以下のようにしてroot 権限でディレクトリの所有者を変更しておきましょう。

# chown sakura.sakura /home/sakura/public_html


DirectoryIndex は、スラッシュ「/」で終わるURLを指定した際に、デフォルトで表示するファイルを指定するもので、一般的には、index.html や index.php などを指定しておきます。例えば、http://linux.click-rescue.com/ をブラウザで入力した場合、ドキュメントルート最上層にindex.html が用意されていればそのファイルが表示されます。もしも、DirectoryIndex で指定したファイルが存在しない場合は、サーバーは、404ステータスコードを返し、ページが見つからない旨をクライアントに伝えます。これは、トップページ限らず、例えば、http://linux.click-rescue.com/photo/ などを指定した場合にも、index.html が用意されていればページが表示されるし、用意されていなければ、404ステータスコード、もしくは403ステータスコード(Forbidden)を返すようになります。

DirectoryIndex index.html index.php


AccessFileName は、アクセス制御を行うためのファイルを指定します。.htaccess はディレクトリごとのアクセス制御をかけるためのファイルのことで、通常はドット「. 」で始まるファイル名を指定し、慣例的には.htaccess がよく使われています。.htaccess の使い方はここでは詳しく説明しませんが、このファイルをアクセス制限をかけたいディレクトリ内に置いておく事でそのディレクトリに対して認証が行われます。そして、認証をパスしたものだけが、そのディレクトリにアクセスできるようになります。なお、デフォルトでは、.htaccess を使用した認証を行う事はできないようになっており、有効にするには、AllowOverrideの値をAll もしくは、AuthConfig に設定しておく必要があるので注意してください。

<Files ~ "^\.ht"> 内では、ブラウザからは .ht で始まるファイル名はアクセスできないように設定しておきます。.htaccess に誰でもブラウザからアクセスできたのでは、その中身を見られてしまうことになるので、このディレクティブは非常に重要な役割を果たしています。

AccessFileName .htaccess

<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>


TypesConfig は、MIME タイプ設定ファイルの位置を設定し、ServerRoot からの相対パスで記述されています。このファイルはファイルの拡張子からコンテントタイプへの デフォルトのマッピングを設定します。/usr/local/apache2/conf/mime.types を閲覧すれば、どのようなタイプの拡張子が既に登録済みなのかを確認する事ができます。

TypesConfig conf/mime.types

上記のMIME タイプファイル に記述されていないマッピングを追加するためには、AddType ディレクティブを使用して上書きをするという方法をとります。なお、mime.types に直接記述したり、あるいは、.htaccess を設置し、そこにMIMEタイプの記述をするという方法も考えられます。例えば、着メロの拡張子である.mmf を追加したい場合、以下のようにする事で実現できます。

AddType application/x-smaf mmf


DefaultType は、MIMEタイプファイルに記述がなかった場合の扱いを指定し、デフォルトでは、text/plain (テキストファイル)が指定されています。

DefaultType text/plain


<IfModule mod_mime_magic.c>では、mod_mine_magic.c モジュールが組み込まれているかどうか確認し、もし組み込まれていれば、ファイル内容から様々な手がかりを探り出しMIMEタイプを決定できるようにしてくれます。mod_mimeは、リクエストされたファイルの拡張子と振る舞い、内容(MIME タイプ、言語、文字セット、エンコーディング) とを関連付けるモジュールです。例えば、".gif" が MIME タイプ image/gif にマップされ、".html" が MIME タイプ text/html にマップされる場合は、ファイル index.gif.html は MIME タイプ "text/html" に関連付けられます。これは、同じメタ情報にマップされる拡張子が複数あるときには、 右側にあるものが使用されるためです。

<IfModule mod_mime_magic.c>
     MIMEMagicFile conf/magic
</IfModule>


HostnameLookups は、IPアドレスをホスト名に変換し(逆引き)、ログに記録する機能を提供します。Onにするとパフォーマンスが低下するため、通常はOff に設定しておき、必要に応じてOn に切り替えるなどしたほうが良いでしょう。また、使う機会はあまりないと思いますが、逆引きを行うのであれば、Apache に付属のlogresolve を使用する事もできます。

HostnameLookups Off


ServerTokens は、HTTPレスポンスヘッダーの値を返し、その中に含まれるサーバーOS に関する情報、コンパイルされたモジュールなどの情報などを返します。これらの情報を相手に提供するのは決して好ましいとはいえないので、コメントアウトして無効にするか、最低限の情報しか表示させないようにします。ServerTokens には、いくつかのレベルを設定する事ができ、デフォルトではFull に設定されています。最も少ない情報を提供するためには、Prod を指定します。以下は、筆者の環境下で試した結果です。

ServerTokens Full
Apache/2.0.48 (Unix) mod_ssl/2.0.48 OpenSSL/0.9.7c DAV/2 PHP/4.3.4 Server at ns Port 80

ServerTokens OS
Apache/2.0.48 (Unix) Server at ns Port 80

ServerTokens Min[imal]
Apache/2.0.48 Server at ns Port 80

ServerTokens Minor
Apache/2.0 Server at ns Port 80

ServerTokens Major
Apache/2 Server at ns Port 80

ServerTokens Prod[uctOnly]
Apache Server at ns Port 80

ServerTokens Prod


ServerSignature は、エラーメッセージなどをクライアントに返す際のフッターラインを表示させるかどうかを指定するディレクティブです。これらの情報を隠蔽するには、値をOff にしておきます。なお、On と Off の他にも、EMail という値も指定する事ができ、上記のServerTokensの例で言うと、ns と表示されているところにリンクが貼られるようになります(mailto:)。

ServerSignature Off


Alias /icons/ は、アイコンが格納されているディレクトリです。FancyIndexing を使わないのなら不要なので全てコメントアウトしておきます。Alias とは、ドキュメントルート以外の場所にファイルを保管することを可能にします。この時、注意したいのは、Alias /icons/ とAlias /icon では、異なる意味を示しています。/icons/ のようにスラッシュが入った場合は、/icons というURL自体はエイリアスされません。詳しくは、Apacheのマニュアルを参照してください。

#Alias /icons/ "/usr/local/apache2/icons/"
#
#<Directory "/usr/local/apache2/icons">
# Options Indexes MultiViews
# AllowOverride None
# Order allow,deny
# Allow from all
#</Directory>


AliasMatch は、上記で説明したAlias ディレクティブと同様の役割をしますが、簡単な先頭からのマッチを行なうのではなく、 標準正規表現を利用します。ここでは、マニュアルが格納されているディレクトリへのエイリアスをしており、マニュアルは必要ないため、マニュアルに関するディレクティブを全行コメントアウトしておきます。

# AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/usr/local/apache2/manual$1"

#<Directory "/usr/local/apache2/manual">
# Options Indexes
# AllowOverride None
# Order allow,deny
# Allow from all
#
# <Files *.html>
# SetHandler type-map
# </Files>
#
# SetEnvIf Request_URI ^/manual/de/ prefer-language=de
# SetEnvIf Request_URI ^/manual/en/ prefer-language=en
# SetEnvIf Request_URI ^/manual/fr/ prefer-language=fr
# SetEnvIf Request_URI ^/manual/ja/ prefer-language=ja
# SetEnvIf Request_URI ^/manual/ko/ prefer-language=ko
# SetEnvIf Request_URI ^/manual/ru/ prefer-language=ru
# RedirectMatch 301 ^/manual(?:/(de|en|fr|ja|ko|ru)){2,}(/.*)?$ /manual/$1$2
#</Directory>


ScriptAlias /cgi-bin/ は、CGIスクリプトへのエイリアスを行っており、2番目の引数にCGIスクリプトが格納されているローカルファイルパスを指定しておきます。バーチャルホストを構築している場合、<VirtualHost>ディレクティブ内にScriptAlias ディレクティブがない場合、デフォルトでここで指定したパスを見に行きます。逆に言えば、バーチャルホストごとにcgi-bin ディレクトリの位置を変更したい場合は、各VirtualHostディレクティブ内でScriptAlias ディレクティブを記述しておく必要があります。

ScriptAlias /cgi-bin/ "/home/sakura/public_html/cgi-bin"

<Directory "/home/sakura/public_html/cgi-bin">
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
</Directory>

なお、上記で指定したScriptAlias はあくまでCGIスクリプトの場所をApache に教えているだけなので、実際にCGIスクリプトを使えるようにするには、AddHandlerディレクティブが有効になっている必要があります。AddHandler は、ファイル名の拡張子を指定されたハンドラにマップする役割を持っており、以下のように記述しておく事で、拡張子 ".cgi" で終わるファイルをCGI スクリプトとして処理するこができるようになります。

AddHandler cgi-script .cgi

cgi-bin ディレクトリ内にgif やjpg などが格納されたディレクトリがあり、そこから画像などを読み込む場合、Apacheはそれらの画像ファイルをスクリプトとしてみなしてしまうため、サーバーエラーが発生します。これを回避するためには、<Direcotry>コンテナ内に、以下のようにAddHandler指示子を追加してあげる必要があります。

ScriptAlias /cgi-bin/ "/home/sakura/public_html/cgi-bin"

<Directory "/home/sakura/public_html/cgi-bin">
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
     AddHandler text/html .html
     AddHandler text/css .css
     AddHandler image/gif .gif
     AddHandler image/jpg .jpg

</Directory>



Redirect は、URLの転送(リダイレクション)を行うディレクティブです。サーバーを移転する際や、URLを変更したい場合などに、簡単に古いURLから新しいURLへと転送させることができるようになります。この処理は一瞬で行われるため、クライアントにリダイレクトの処理が行われた事を意識させることなく、新URLへ転送させることが可能になります。記述例は以下のようになります。この時注意したいのは、新しいURLとして指定する2番目の引数は必ず、絶対パスで記述しなくてはならないということです。以下の例で説明すると、http://linux.click-rescue.com/ は、http://new.click-rescue.com へリダイレクトされます。

Redirect / http://new.click-rescue.com/

Redirect には、以下の4つのオプションを付け加える事ができます。

Redirect permanent
永久にリダイレクトをするステータス (301) を返します。リソースが永久に移動した場合に使用します。
Redirect temp
一時的なリダイレクトステータス (302) を返します。

Redirect seeother
"See Other" ステータス (303) を返します。リソースが他のもので置き換えられた場合に使用します。
Redirect gone
"Gone" ステータス (410) を返します。リソースが永久に 削除された場合に使用します。引数は省略しなければなりません。



IndexOptions は、ディレクトリインデックスの様々な挙動を指定するディレクティブです。デフォルトで記述されているFancyIndexing は、飾り付きインデックスをオンにします。VersionSort は、バージョン番号を含んだファイルが 自然な方法でソートされるようにします。仮にfoo-1.7とfoo-1.7.2 とfoo-1.8というファイルがあった場合に、バージョン番号の低いものから順に上からソートされます。IndexOptions には、様々なオプションがあり、ここでは敢えて説明を割愛させていただきます。詳しく知りたい方は、Apache のドキュメントを参照してください。

IndexOptions FancyIndexing VersionSort


AddIconByTypeは、FancyIndexing において、ファイルの左側に表示するアイコンを設定します。パスは相対パスを指定しておきます。ディレクトリインデックスを行わない場合は不要となりますので必要に応じてコメントアウトしても構わないでしょう。以下に記述されているAddIconディレクティブも同様です。

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*


DefaultIcon は、FancyIndexing において、特定のアイコンがない場合にファイルに表示するアイコンを設定します。これも、ディレクトリインデックスを使わないのなら不要です。

DefaultIcon /icons/unknown.gif


ReadmeNameHeaderName は、ディレクトリインデックスを使用している場合に表示されるフッターとヘッダーファイルを指定します。ディレクトリインデックスを使用しない場合は、不要なのでコメントアウトしておきます。

# ReadmeName README.html
# HeaderName HEADER.html


IndexIgnore は、ディレクトリインデックスを行う場合に、無視するファイルを指定します(インデックス一覧に表示されないファイル名を指定する)。引数には、無視したい拡張子やファイル名の一部、ワイルドカード表現か完全なファイル名を指定しておきます。ディレクトリインデックスを行わない場合は不要です。

IndexIgnore .??* *~ *


LanguagePriority は、使用する言語の優先順位を指定します。ここでは、日本を表す ja を先頭に持ってきています。

LanguagePriority ja en ca cs da de el eo es et fr he hr it ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW


ForceLanguagePriority は、 要求に合うドキュメントを一つだけ返すことができないときに、 LanguagePriority ディレクティブを使ってネゴシエーションの結果を返します。デフォルトでは、Prefer と Fallback が指定されていますが、特に変更する必要はありません。Prefer は、クライアントの Accept-Language ヘッダをみて、それが同等の優先順位であった場合などには、LanguagePriority で指定された順に送られます。Fallback は、クライアントのAccept-LanguageからLanguagePriority で指定された許容言語が見つからなかった場合に、LanguagePriorityで指定された最初のものから順番に送られるという指定になります。

ForceLanguagePriority Prefer Fallback


AddDefaultCharset は、明示的に指定のないCharset が見つからない場合に、デフォルトで返すCharset を指定します。デフォルトでは、ISO-8859-1(Latin-1)になっているため、日本語環境では文字化けが発生します。このディレクティブは必ず、無効にしておくか、あるいは明示的にデフォルトのCharset を指定しておく必要があります。明示的に指定する場合、サイトのコンテンツに合わせて、none、shift_jis、EUC-JPのどれかをしておけばいいでしょう。

# AddDefaultCharset ISO-8859-1


SSI を使用する場合には、以下2行のディレクティブを有効にしておきます。Apache1.3x とはディレクティブの指定が異なり、1.3xの場合は、AddHandler server-parsed .shtml と指定します。

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

なお、SSI を利用するもうひとつの方法として、XBitHack というディレクティブを使用する事もできます。これがOn になっている場合、HTMLファイルに実行権を与えるだけで(chmod +x index.html )、ファイル名を .shtml に変更しなくてもいいという利点があります。詳しく知りたい方は、Apache のドキュメントを参照してください。

XBitHack on


ErrorDocument は、エラーが発生した場合にクライアントに表示するメッセージをカスタマイズすることができます。通常は、Apache に標準で用意されているエラーメッセージが表示されるか、もしくは、IEやNescape などのブラウザにデフォルトのエラーメッセージが返されます。404ステータスコードの「ページが表示されません」などが代表的な例で、この無味乾燥なエラーメッセージが気にくわない方は自分でカスタマイズしてみてください。指定できるのは、ダブルクォーテーション「"」で囲んだテキストメッセージのパターンと、URLを指定して、そこにエラーメッセージの用のHTMLなどを用意しておくパターンがあります。また、Perl を用いたCGI を指定する事なども可能です。URLを指定する場合は、相対パス、絶対パスどちらでも構いません。因みに当サイトのエラーメッセージはこちらをクリックしてください。

ErrorDocument 404 /missing.html
ErrorDocument 403 /forbidden.html

なお、バーチャルホストを構築している場合は、全てのサイトが同じエラーメッセージを返すというのではあまり面白いとはいえないので、以下のようにして<VirtualHost> ディレクティブ内にもErrorDocument ディレクティブを指定しておいた方がいいでしょう。

<VirtualHost *>
     ServerName linux.click-rescue.com
     DocumentRoot /home/sakura/public_html/linux
     ErrorDocument 403 /error/403.php
     ErrorDocument 404 /error/404.php
</VirtualHost>

<VirtualHost *>
     ServerName new.click-rescue.com
     DocumentRoot /home/sakura/public_html/new
     ErrorDocument 403 /error/403.php
     ErrorDocument 404 /error/404.php
</VirtualHost>

また、デフォルトで用意されているエラーメッセージにエイリアスさせたい場合は、以下の30行のラインのコメントを削除し、ディレクティブを有効にします。ただし、通常は、403、404、500、401ぐらいしか使わないと思うので全てアンコメントする意味はあまり感じませんが…。

# Alias /error/ "/usr/local/apache2/error/"
#
# <Directory "/usr/local/apache2/error">

中略

# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var



3.Section 3: Virtual Hosts

<VirtualHost *> は、複数Webサイトを構築する際に必要となるディレクティブです。おそらく自宅サーバーを構築する方なら誰もが複数のWebサイトを構築したいと思うでしょうが、その際に、マシンをわざわざ2台用意する必要はありません。一台のサーバーで、仮想的に複数のWebサイトを運営する事ができるのです。まず、NameVirtualHost ディレクティブをアンコメントし、有効にします。
*:80 には、「IPアドレス:ポート番号(Listen)」を指定しますが、アスタリスクの場合は、全てのIPアドレスにマッチします。

NameVirtualHost *:80

<VirtualHost *>
     ServerAdmin root@click-rescue.com
     ServerName linux.click-rescue.com
     DocumentRoot /home/sakura/public_html/linux
     ScriptAlias /cgi-bin/ "/var/data/cgi-bin/"
     ErrorLog logs/linux-error_log
     TransferLog logs/linux-access_log

     ErrorDocument 403 /error/403.php
     ErrorDocument 404 /error/404.php
</VirtualHost>




c. Apacheのログファイル

1.Apache でのログの概要

まず、Apache のログ指定では、以下のように4つのログフォーマットが用意されており、デフォルトでは、2行目のcommon が指定されています。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

上記の4つのLogFormat のうち、どのログ形式を使用するかを指定するディレクティブが以下のCustomLog フォーマットです。もう予測はついたと思いますが、要するに自分の環境に合ったLogFormat を作成し、それをCustomLogで指定すればいいわけです。

CustomLog logs/access_log common

そこでまず覚えておきたいのが、Apache のログフォーマットの変数です。%h だの%l だの書かれていても何のことだかさっぱりわからないと思うので、以下表を参考にしログのフォーマットをカスタマイズしていきます(他にももっとたくさんあります)。詳細について詳しく知りたい方は以下URLを参照してください。

http://httpd.apache.org/docs-2.0/ja/mod/mod_log_config.html

●LogFormatの変数
 %a リモートIPアドレス
 %A ローカルIPアドレス
 %B HTTPヘッダを除いた転送バイト数
 %b HTTPヘッダを除いた転送バイト数。転送バイト数が0の場合は - が記述されます。
 %h リクエストしたリモートホスト名
 %H リクエストされたプロトコル
 %l identによるリモート・ユーザ名
 %t リクエストを受けた時刻
 %r HTTPリクエストヘッダー
 %s サーバーがリクエストに対して返したステータスコード。%>s と記述することで最後のリクエストを記します。
 %U リクエストされたURL
 %u 認証に使用されたリモートユーザー名
 %v リクエストを処理するサーバー名
 %V UseCanonicalNameディレクティブの設定に応じたサーバー名

その他にも、どのURLから来たかを取得するリファラーを指定する場合には、%{Referer}i をつけます。%{User-Agent}i はクライアントのブラウザやOS の情報を取得することができます。なお、デフォルトで用意されているcombined を使用すればユーザーエージェントとリファラーがログに記録されます。

CustomLog logs/access_log combined



2.画像情報を取得しない

Apache のログはデフォルトでは、リクエストされた画像情報までログに残します。しかし、これらの情報はあまり必要ないし、仮に1ページに10個の画像が配置されていたら、10行の画像情報のログを吐くことになるため、ログが無駄に肥大化します。また、ログを閲覧する際にも非常に見にくくなりますので画像に関してはログには出力しないように設定しておきます。ここでは、Apache のモジュールのひとつである、SetEnvIf を使用します。SetEnvIf はApache のインストール時にデフォルトで組み込まれていますが、念のため以下コマンドで確認しておいてください。

# apachectl -l
mod_setenvif.c

●画像の出力例
192.38.233.56 - - [19/Jan/2004:00:48:40 +0900] "GET /img/a.jpg HTTP/1.1" 404 294
192.38.233.56 - - [19/Jan/2004:00:48:54 +0900] "GET /img/b.jpg HTTP/1.1" 404 294
192.38.233.56 - - [19/Jan/2004:00:49:02 +0900] "GET /img/c.jpg HTTP/1.1" 404 294

次に、httpd.conf を編集していきます。以下のようにSetEnvIf ディレクティブを追記し、CustomLog にenv=!nolog を追加しておきます。ドット「. 」の前にはエスケーブ文字「\」をつけるのも忘れないようにしましょう。筆者の場合は、.css と .js の情報もいらないのでついでに追加しておきます。

CustomLog logs/access_log combined env=!nolog

# SetEnvIf
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog

最後にApache を再起動します。再起動したら、画像がたくさん置いてあるページにアクセスしてログを確認してみてください。かなりすっきりした表示になっていると思います。

# apachectl restart



3.ワームのログを記録しない or 別出力する

Apache には、Nimda やCodeRed などのワークのログも記録されます。access.log を開いてみると以下のようなログが出力されているのが見つかると思います。以下はCodeRed のログで、Apache を使っている方にとっては無視してもいいので(CodeRed やNimda はIISを対象としたワーム)、ログを記録しないか、あるいは別出力するように設定しておきます。

219.154.22.X - - [19/Jan/2004:10:50:21 +0900] "GET /default.ida?XXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX %u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0" 404 209

まず、以下のようなワームが残すログをaccess_log には記録しないように設定し、また、ワームのログだけを worm_log に別出力とすることにします。

SetEnvIf Request_URI "^/_mem_bin/" worm nolog
SetEnvIf Request_URI "^/_vti_bin/" worm nolog
SetEnvIf Request_URI "^/c/" worm nolog
SetEnvIf Request_URI "^/d/" worm nolog
SetEnvIf Request_URI "^/msadc/" worm nolog
SetEnvIf Request_URI "^/MSADC/" worm nolog
SetEnvIf Request_URI "^/scripts/" worm nolog
SetEnvIf Request_URI "^/default.ida" worm nolog

CustomLog logs/access_log combined env=!nolog # ワームログを切り落とす
CustomLog logs/worm_log combined env=worm # ワームログを別出力

最後に、worm_log をローテーションできるようにしておきます。/etc/logrotate.d/httpd に以下のようにワームのログローテート設定を追加しておきます。ログのローテーションに関しては、「logrotate によるログのローテーション」を参照してください。

# vi /etc/logrotate.d/httpd
/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log
/usr/local/apache2/logs/worm_log {
      weekly
      rotate 4
      missingok
      sharedscripts
      postrotate
            /bin/killall -HUP `cat /usr/local/apache/logs/httpd.pid 2>/dev/null` 2> /dev/null
      endscript
}

 Remote_Host リモートホスト名
 Remote_Addr リモートアドレス
 Remote_User 認証されたユーザ名
 Request_Method 使用されているメソッド名
 Request_Protocol リクエストが行なわれたプロトコルの名前とバージョン(HTTP1.1など)
 Request_URI URL のスキームとホストの後の部分



4.自ネットワークからのアクセスを別出力する

ここまできたら、もう要領は同じですね。自分のネットワークからのアクセスを外部からのアクセスログとは別に出力します。また、上記で設定した画像情報も出力しないようにしておきます。ログのローテーションも上記の要領で行っておいてください。

SetEnvIf Remote_Addr ^172\.16\. localnet nolog
CustomLog logs/localnet_log common env=!nolog
CustomLog logs/localnet_log common env=localnet



5.agent/referer ログを別出力

httpd.conf を眺めていると以下のような行が見つかると思います。このディレクティブを有効にすると、エージェントログとリファラーログが別出力されるようになるので、アクセス層を調べたり、参照元を調べたりするにはちょうどいいかもしれません。興味のある方は、ディレクティブを有効にして、試してみてください。

CustomLog logs/referer_log referer
CustomLog logs/agent_log agent

●agent ログの出力例
Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90)
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; ja-jp) AppleWebKit/106.2 (KHTML, like Gecko) Safari/100.1



6.エラーログのLogLevel

Apache のエラーログを記録するerror.log のデフォルトのログレベルはwarn に設定されています。運用状態にあるサーバでは、warn もしくは、noticeでも構いませんが、テスト段階であれば、info や debug を使ったりもします。以下に、設定できるログレベルについて解説しておきます。でも、実際に試してみないとイメージが沸かないと思うので、自分で試してみることをお勧めします。

ErrorLog logs/error.log
LogLevel warn

●LogLevel
 emerg 緊急に対処する必要があるメッセージを記録する
 alert 警告メッセージを記録する
 crit 致命的なメッセージを記録する
 error 存在しないファイルへのアクセスなどのエラーが記録される
 warn 警告メッセージ。設定ミスがある場合に、警告を発する。
 notice 通知メッセージを記録する
 info プロセスの起動や停止などの情報が記録される
 debug デバッグに必要となる情報を記録する



d. アクセス制限


e. モジュールの利用


f. Apacheのチューニング


z. 出題範囲概要

概要 :
  • Apache HTTP サーバーのインストールと設定ができる。これには、サーバーの負荷と性能の監視、クライアントからのユーザアクセスの制限、モジュールとしてのスクリプト言語をサポートする設定、およびクライアントユーザの認証設定も含まれる。また、サーバーのオプション設定でリソースの使用を制限することも含まれる。仮想ホストを使用するようApache HTTP サーバーを設定し、ファイルへのアクセスをカスタマイズできる。

詳細 :
  • Apache HTTP サーバー の設定ファイル、用語、ユーティリティ
    httpd, apache2
    httpd.conf, mod_auth_basic, mod_authz_host
    apachectl, apache2ctl
  • Apache HTTP サーバーのログファイルの設定と内容
    アクセスログとエラーログ
  • アクセス制限の方法とファイル
    .htaccess, AuthUserFile, AuthGroupFile
  • クライアントユーザを認証するファイルとユーティリティ
    htpasswd
  • 最大リクエスト数、最小/最大サーバー数およびクライアント数の設定
  • Apache HTTP サーバー における仮想ホストの実装
  • ファイルへのアクセスをカスタマイズするために、Apache HTTP サーバーの設定ファイルで Redirect 文を使用する。

  [ 例題 ] 


         

    www.it-shikaku.jp